﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;
using System.Collections.Generic;
using System.Linq;

namespace LM.Servicos
{
    public class ServicoDeMarca : IServicoDeMarca
    {
        public void Cadastre(DtoMarca marca)
        {
            var repositorioDeMarca = FabricaDeRepositorios.Crie<IRepositorioDeMarca>();
            var validadorDeMarca = new ValidadorDeMarca(repositorioDeMarca);
            var marcaObjeto = ConversorDeObjetos.Copie<Marca>(marca);

            validadorDeMarca.ValideCadastro(marcaObjeto);

            repositorioDeMarca.Cadastre(marcaObjeto);
        }

        public void Atualize(DtoMarca marca)
        {
            var repositorioDeMarca = FabricaDeRepositorios.Crie<IRepositorioDeMarca>();
            var validadorDeMarca = new ValidadorDeMarca(repositorioDeMarca);
            var marcaObjeto = ConversorDeObjetos.Copie<Marca>(marca);

            validadorDeMarca.ValideAtualizacao(marcaObjeto);

            repositorioDeMarca.Atualize(marcaObjeto);
        }

        public void Exclua(int codigo)
        {
            var repositorioDeMarca = FabricaDeRepositorios.Crie<IRepositorioDeMarca>();
            var validadorDeMarca = new ValidadorDeMarca(repositorioDeMarca);
            var marcaObjeto = ConversorDeObjetos.Copie<Marca>(repositorioDeMarca.Consulte(codigo));

            validadorDeMarca.ValideExclusao(marcaObjeto);

            repositorioDeMarca.Exclua(marcaObjeto);
        }

        public DtoMarca Consulte(int codigo)
        {
            var marcaObjeto = FabricaDeRepositorios.Crie<IRepositorioDeMarca>().Consulte(codigo);

            return ConversorDeObjetos.Copie<DtoMarca>(marcaObjeto);
        }

        public IList<DtoMarca> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoMarca, Marca>(FabricaDeRepositorios.Crie<IRepositorioDeMarca>().ConsulteTodos());
        }

        public IList<DtoMarca> Consulta(string nome)
        {
            return ConsulteTodos().Where(marca => marca.Descricao == nome).ToList();
        }
    }
}
